﻿using System;
using System.Data;
using System.Collections;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using NHibernate;
using NHibernate.Cfg;
using System.Text.RegularExpressions;
using System.Collections.Generic;

/// <summary>
/// Control de flujo de datos de la entidad factura.
/// </summary>

public class FacturaControl
{
    public FacturaControl()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    public IList GetFacturas()
    {
        IList facturas = null;

        ISession session = NHibernateControl.GetCurrentSession();
        try
        {
            ITransaction tx = session.BeginTransaction();
            facturas = session.CreateCriteria(typeof(Factura)).List();
            session.Flush();
            NHibernateControl.CloseSession();
        }
        catch (NHibernate.TransactionException a) {
            Console.Write(a.Message);
        }
        


        return facturas;
    }

    /// <summary>
    /// Funcion para devolver todos los campos de una factura especifica
    /// </summary>
    /// <param name="id">id de factura</param>
    /// <returns>Factura</returns>
    public Factura Consultar(int id)
    {
        IList facturas = this.GetFacturas();
        Factura factura = new Factura();

        foreach (Factura facturaGuardada in facturas)
        {
            if (facturaGuardada.Id == id)
                factura = facturaGuardada;
        }

        return factura;
    }

    /// <summary>
    /// Busca todas las facturas por cada campo segun lo ingresado por pantalla
    /// </summary>
    /// <param name="query">string ingresado</param>
    /// <returns>IList de facturas</returns>
    public IList Buscar(String query)
    {

        IList facturas = this.GetFacturas();
        IList resultado = new ArrayList();

        foreach (Factura factura in facturas)
        {
            if (Regex.IsMatch(factura.Numero.ToString(), "^" + query))
                resultado.Add(factura);
            else if (Regex.IsMatch(factura.Fecha.ToString(), "^" + query))
                resultado.Add(factura);
            else if (Regex.IsMatch(factura.Titulo.ToLower(), "^" + query))
                resultado.Add(factura);
            else if (Regex.IsMatch(factura.Porcentaje.ToString(), "^" + query))
                resultado.Add(factura);
            else if (Regex.IsMatch(factura.Estado.ToLower(), "^" + query))
                resultado.Add(factura);
            else if (Regex.IsMatch(factura.Monto.ToString(), "^" + query))
                resultado.Add(factura);

        }
        return resultado;
    }

    /// <summary>
    /// Busca todas las facturaspara un año dado
    /// </summary>
    /// <param name="fecha">Año de la fecha de la factura</param>
    /// <returns></returns>
    public IList FacturasFecha(string fecha)
    {
        IList facturas = this.GetFacturas();
        IList fac = new ArrayList();
        int año = System.Int32.Parse(fecha);

        foreach (Factura facturaactual in facturas)
        {
            if (facturaactual.Fecha.Year.Equals(año))
            {
                fac.Add(facturaactual);
            }
        }

        return fac;
    }

    /// <summary>
    /// Busca todas las facturas emitidas para una
    /// fecha dada y el status que puede ser cobrada o emitida
    /// </summary>
    /// <param name="fecha">Año de la fecha de la factura</param>
    /// <returns></returns>

    public IList BuscarFacturasFechaCobrada(String query1)
    {
        IList facturas = new ArrayList();
        facturas = this.GetFacturas();
        IList resultado = new ArrayList();
        foreach (Factura factura in facturas)
        {
            if (Regex.IsMatch(factura.Fecha.ToString(), "^" + query1))
            {
                resultado.Add(factura);
            }

        }
        return resultado;
    }

    /// <summary>
    /// Busca todas las facturas cobradas por año y estado
    /// que puede ser cobrada o emitida
    /// </summary>
    /// <param name="ano">string año> <name="estado">string estado</param>
    /// <returns>IList de facturas</returns>
    public IList BuscarFacturasAnoEstado(String ano, String estado)
    {
        IList facturas = this.GetFacturas();
        IList fac = new ArrayList();
        int año = System.Int32.Parse(ano);

        foreach (Factura fact in facturas)
        {
            if ((fact.Fecha.Year.Equals(año)) && ((fact.Estado.Equals(estado))))
            {
                fac.Add(fact);
            }
        }
        return fac;
    }

    /// <summary>
    /// Busca todos los titulos de las propuestas
    /// </summary>
    /// <returns>Ilist con los titulos de las propuestas</returns>
    public IList<Propuesta> TituloPropuestas()
    {
        IList<Propuesta> titulos = null;

        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        titulos = (IList<Propuesta>)session.CreateSQLQuery("SELECT * FROM PROPUESTA WHERE PRO_ID NOT IN(SELECT FAC_PRO_ID FROM FACTURA)", "hola", typeof(Propuesta)).List<Propuesta>();

        session.Flush();
        NHibernateControl.CloseSession();
        return titulos;
    }

    /// <summary>
    /// Inserta una factura
    /// </summary>
    /// <param name="fecha"> fecha de la facturacion</param>
    /// <param name="txtmonto"> monto de la factura</param>
    /// <param name="txtporcentaje"> porcentaje de la factura</param>
    /// <param name="txttitulo"> titulo de la factura</param>
    public void InsertarFacturas(System.Int32 Id, Double txtmonto, Double txtporcentaje, DateTime fecha, System.Int32 numerofactura)
    {
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        IList propuestas = null;
        Factura factura = new Factura();
        factura.Estado = "Emitida";
        factura.Fecha = fecha;
        factura.Monto = txtmonto;
        factura.Status = 0;
        //factura.Titulo = txttitulo;
        factura.Numero = numerofactura;
        factura.Porcentaje = txtporcentaje;
        propuestas = session.CreateCriteria(typeof(Propuesta)).List();

        foreach (Propuesta propuesta in propuestas)
        {

            if (propuesta.Id.Equals(Id))
            {
                factura.Propuesta = propuesta;
                factura.Titulo = propuesta.Titulo;
                break;
            }

        }

        session.Save(factura);

        tx.Commit();
        NHibernateControl.CloseSession();

    }

   
    /// <summary>
    ///Modifica la factura
    /// </summary>
    /// <param name="FechaFactura">  fecha de la factura</param>
    /// <param name="montofactura"> monto de la factura</param>
    /// <param name="porcentajefactura"> porcentaje de la factura</param>
    /// <param name="titulofactura"> titulo de la factura</param>
    /// <param name="idfactura"> id de la factura</param>
    /// <param name="idpropuesta">id de la propuesta</param>
    /// <param name="numerofactura">numero de la factura</param>

    public void ModificarFactura(String montofactura, DateTime FechaFactura, String numerofactura, String porcentajefactura, System.Int32 idfactura, System.Int32 idpropuesta)
    {
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();
        Factura factura = new Factura();
        factura.Id = idfactura;
        factura.Estado = "Emitido";
        factura.Monto = System.Double.Parse(montofactura);
        factura.Numero = System.Int32.Parse(numerofactura);
        factura.Porcentaje = System.Double.Parse(porcentajefactura);
        factura.Fecha = FechaFactura;
        IList propuestas = null;
        propuestas = session.CreateCriteria(typeof(Propuesta)).List();

        foreach (Propuesta propuesta in propuestas)
        {

            if (propuesta.Id.Equals(idpropuesta))
            {
                factura.Propuesta = propuesta;
                factura.Titulo = propuesta.Titulo;
                break;
            }

        }
        session.Update(factura);

        tx.Commit();
        NHibernateControl.CloseSession();
   }

    public IList BuscarFacturasFecha(String query1)
    {
        IList facturas = new ArrayList();
        facturas = this.GetFacturas();
        IList resultado = new ArrayList();
        foreach (Factura factura in facturas)
        {
            if (Regex.IsMatch(factura.Fecha.ToString(), "^" + query1))
            {
                resultado.Add(factura);
            }

        }
        return resultado;
    }


    public void CambiarEstatusFactura(System.Int32 idfactura)
    {


        PagoControl control = new PagoControl();
        IList pagos = null;
        pagos = control.GetPagos();
        Double acumulado = 0;
        foreach (Pago pago in pagos)
        {
            if (pago.Factura.Id == idfactura)
            {
                Double auxiliar = pago.Monto;
                acumulado = acumulado + auxiliar;
            }

        }

        IList facturas = null;
        facturas = this.GetFacturas();

        foreach (Factura factura in facturas)
        {
            if (factura.Estado == "Emitida")
            {
                if (factura.Id == idfactura)
                {
                    if (acumulado >= factura.Monto)
                    {
                        ISession session = NHibernateControl.GetCurrentSession();
                        ITransaction tx = session.BeginTransaction();
                        factura.Estado = "Cobrada";
                        session.Update(factura);
                        tx.Commit();
                        NHibernateControl.CloseSession();
                    }

                }
            }

        }
        
    }
}

    
       

